// 给定一个非负整数数组 A， A 中一半整数是奇数，一半整数是偶数。
// 对数组进行排序，以便当 A[i] 为奇数时，i 也是奇数；当 A[i] 为偶数时， i 也是偶数。
// 你可以返回任何满足上述条件的数组作为答案。
// 已知：
// 2 <= A.length <= 20000
// A.length % 2 == 0
// 0 <= A[i] <= 1000

// 常规解法，两轮循环
const sortArrayByParityII1 = function (A: number[]): number[] {
    const odd: number[] = []; // 奇数数组
    const even: number[] = []; // 偶数数组
    // 记录
    for (let num of A) {
        if (num % 2 === 0) {
            even.push(num);
        } else {
            odd.push(num);
        }
    }
    // 填数组
    for (let i = 0; i < A.length; i++) {
        if (i % 2 === 0) {
            A[i] = even.pop()!;
        } else {
            A[i] = odd.pop()!;
        }
    }
    return A;
};

// 暴露接口
const sortArrayByParityII = function (A: number[]): number[] {
    for (let i = 0; i < A.length; i++) {
        let reset: number = A[i] % 2
        if (i % 2 !== reset) {
            let end = i;
            while (end % 2 === A[end] % 2 || A[end] % 2 === reset) {
                end++
            }
            sortArrayByParityII_swap(A, i, end)
        }
    }
    return A;
};

// 交换辅助方法
function sortArrayByParityII_swap(arr: number[], index1: number, index2: number) {
    let temp = arr[index1];
    arr[index1] = arr[index2];
    arr[index2] = temp;
}

sortArrayByParityII([648, 831, 560, 986, 192, 424, 997, 829, 897, 843])


// 这道题目难度并不大， 因为题目对结果数组的排序并没有要求，
// 最直接的解法是先走一遍原数组，然后分别用奇数数组和偶数数组记录下元素
// 然后重新走一遍元素，根据当前索引和记录的数组来往原数组填数即可
// 时间复杂度和空间复杂度都为On
// 还有一种将空间复杂度摊到时间复杂度上的方法是
// 因为已知奇数偶数元素都是数量相等的，我们遇到一个对应位置不匹配的元素
// 就往前找到另一个对应位置不匹配的元素，让他们的位置对换
// 但显然最坏的情况，即前一半偶数，后一半奇数的情况，时间复杂度会达到On2